package high.concurrent.pay.service.impl;

import com.alibaba.fastjson.JSON;
import high.concurrent.dto.AccountDto;
import high.concurrent.dto.MsgDto;
import high.concurrent.enums.MQConstant;
import high.concurrent.enums.MsgEnum;
import high.concurrent.feign.FeignMsgService;
import high.concurrent.pay.service.PayCallbackService;
import high.concurrent.vo.PayInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class AddAccountAmountImpl implements PayCallbackService {

    private static AddAccountAmountImpl addAccountAmountImpl;

    @Autowired(required = false)
    private FeignMsgService feignMsgService;

    //初始化
    @PostConstruct
    public void init() {
        addAccountAmountImpl = this;
    }


    /**
     * 当前服务在eureka的服务名
     */
    @Value("${spring.application.name}")
    private String appName;

    @Override
    public List<String> toBeSend(PayInfoVO payInfoVO) {
        List<String> msgIds = new ArrayList<>();
        // (用户服务-向消息表添加用户消息)
        MsgDto txMsgDTOAuth = createMsgDataAuth(payInfoVO);
        msgIds.add(txMsgDTOAuth.getMsgId());
        return msgIds;
    }

    @Override
    public void updateLocalTransaction(PayInfoVO payInfoVO) {

    }

    @Override
    public void hasBeenSent(List<String> messageIds) {

    }

    /**
     * 优先通知消息服务，创建一条消息数据，状态为未发送(用户服务)
     * @param payInfoVO
     */
    private MsgDto createMsgDataAuth(PayInfoVO payInfoVO) {
        log.info("进入createMsgDataAuth接口");
        // 把需要写到消息表中的内容提到方法写去（用户服务），调用同样的方法
        try {
            MsgDto txMsgDTOData = this.setAuthMsgParam(payInfoVO);
            MsgDto txMsgDTO = addAccountAmountImpl.feignMsgService.createMsgDataByMsgService(txMsgDTOData);
            log.info("完成createMsgDataAuth接口");
            return txMsgDTO;
        }catch (Exception e){
            e.printStackTrace();
            log.info("createMsgDataAuth接口异常");
            return null;
        }

    }

    /**
     * 把需要写到消息表中的内容提到方法写去（用户服务）
     * @param payInfoVO
     * @return
     */
    private MsgDto setAuthMsgParam(PayInfoVO payInfoVO){

        log.info("进入setAuthMsgParam接口");
        // 创建消息DTO
        MsgDto msgDto = new MsgDto();
        // 设置修改订单状态需要的值(订单号，修改用户，修改后的状态)
        AccountDto authDto = new AccountDto();
        // 设置订单号
        authDto.setOutTradeNo(payInfoVO.getOutTradeNo());
        // 设置用户id
        authDto.setId(payInfoVO.getAccountNo());
        // 充值金额
        authDto.setPayFee(payInfoVO.getPayFee());
        // 支付业务 0:充值网费 1:转包付费
        authDto.setPayType(payInfoVO.getPayType());
        // 把该OrderDTO转换为JSON,存储到TxMsgDTO
        msgDto.setJsonMsg(JSON.toJSONString(authDto));
        // 设置服务名
        msgDto.setAppName(addAccountAmountImpl.appName);
        // 设置路由名
        msgDto.setRoutingKey(MQConstant.AUTH_ROUTING_KEY);

        // 消息ID,MsgId通过(枚举_订单号)进行设定（可自行设定，只要能区分出订单和用户的消息就可以）
        msgDto.setMsgId(MsgEnum.AUTH.getCode() + "_" + payInfoVO.getOutTradeNo());

        log.info("完成setAuthMsgParam接口");

        return msgDto;
    }
}
